jetcrab\lexer\tokens/
operators.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
4pub enum Operator {
5    // Assignment operators
6    Assign,
7    PlusAssign,
8    MinusAssign,
9    StarAssign,
10    SlashAssign,
11    PercentAssign,
12    StarStarAssign,
13    LeftShiftAssign,
14    RightShiftAssign,
15    UnsignedRightShiftAssign,
16    BitwiseAndAssign,
17    BitwiseOrAssign,
18    BitwiseXorAssign,
19
20    // Comparison operators
21    Equal,
22    NotEqual,
23    StrictEqual,
24    StrictNotEqual,
25    LessThan,
26    LessThanEqual,
27    GreaterThan,
28    GreaterThanEqual,
29
30    // Logical operators
31    LogicalAnd,
32    LogicalOr,
33    LogicalNot,
34
35    // Arithmetic operators
36    Plus,
37    Minus,
38    Star,
39    Slash,
40    Percent,
41    StarStar,
42
43    // Bitwise operators
44    BitwiseAnd,
45    BitwiseOr,
46    BitwiseXor,
47    LeftShift,
48    RightShift,
49    UnsignedRightShift,
50    BitwiseNot,
51
52    // Increment/Decrement
53    Increment,
54    Decrement,
55
56    // Special operators
57    Arrow,
58    OptionalChaining,
59    Spread,
60    Rest,
61    PrivateField,
62}
63
64impl Operator {
65    pub fn as_str(&self) -> &'static str {
66        match self {
67            Operator::Assign => "=",
68            Operator::PlusAssign => "+=",
69            Operator::MinusAssign => "-=",
70            Operator::StarAssign => "*=",
71            Operator::SlashAssign => "/=",
72            Operator::PercentAssign => "%=",
73            Operator::StarStarAssign => "**=",
74            Operator::LeftShiftAssign => "<<=",
75            Operator::RightShiftAssign => ">>=",
76            Operator::UnsignedRightShiftAssign => ">>>=",
77            Operator::BitwiseAndAssign => "&=",
78            Operator::BitwiseOrAssign => "|=",
79            Operator::BitwiseXorAssign => "^=",
80            Operator::Equal => "==",
81            Operator::NotEqual => "!=",
82            Operator::StrictEqual => "===",
83            Operator::StrictNotEqual => "!==",
84            Operator::LessThan => "<",
85            Operator::LessThanEqual => "<=",
86            Operator::GreaterThan => ">",
87            Operator::GreaterThanEqual => ">=",
88            Operator::LogicalAnd => "&&",
89            Operator::LogicalOr => "||",
90            Operator::LogicalNot => "!",
91            Operator::Plus => "+",
92            Operator::Minus => "-",
93            Operator::Star => "*",
94            Operator::Slash => "/",
95            Operator::Percent => "%",
96            Operator::StarStar => "**",
97            Operator::BitwiseAnd => "&",
98            Operator::BitwiseOr => "|",
99            Operator::BitwiseXor => "^",
100            Operator::LeftShift => "<<",
101            Operator::RightShift => ">>",
102            Operator::UnsignedRightShift => ">>>",
103            Operator::BitwiseNot => "~",
104            Operator::Increment => "++",
105            Operator::Decrement => "--",
106            Operator::Arrow => "=>",
107            Operator::OptionalChaining => "?.",
108            Operator::Spread => "...",
109            Operator::Rest => "...",
110            Operator::PrivateField => "#",
111        }
112    }
113
114    pub fn precedence(&self) -> u8 {
115        match self {
116            Operator::LogicalOr => 1,
117            Operator::LogicalAnd => 2,
118            Operator::BitwiseOr => 3,
119            Operator::BitwiseXor => 4,
120            Operator::BitwiseAnd => 5,
121            Operator::Equal
122            | Operator::NotEqual
123            | Operator::StrictEqual
124            | Operator::StrictNotEqual => 6,
125            Operator::LessThan
126            | Operator::LessThanEqual
127            | Operator::GreaterThan
128            | Operator::GreaterThanEqual => 7,
129            Operator::LeftShift | Operator::RightShift | Operator::UnsignedRightShift => 8,
130            Operator::Plus | Operator::Minus => 9,
131            Operator::Star | Operator::Slash | Operator::Percent => 10,
132            Operator::StarStar => 11,
133            Operator::LogicalNot | Operator::BitwiseNot => 12,
134            Operator::Increment | Operator::Decrement => 13,
135            _ => 0,
136        }
137    }
138
139    pub fn is_assignment(&self) -> bool {
140        matches!(
141            self,
142            Operator::Assign
143                | Operator::PlusAssign
144                | Operator::MinusAssign
145                | Operator::StarAssign
146                | Operator::SlashAssign
147                | Operator::PercentAssign
148                | Operator::StarStarAssign
149                | Operator::LeftShiftAssign
150                | Operator::RightShiftAssign
151                | Operator::UnsignedRightShiftAssign
152                | Operator::BitwiseAndAssign
153                | Operator::BitwiseOrAssign
154                | Operator::BitwiseXorAssign
155        )
156    }
157
158    pub fn is_comparison(&self) -> bool {
159        matches!(
160            self,
161            Operator::Equal
162                | Operator::NotEqual
163                | Operator::StrictEqual
164                | Operator::StrictNotEqual
165                | Operator::LessThan
166                | Operator::LessThanEqual
167                | Operator::GreaterThan
168                | Operator::GreaterThanEqual
169        )
170    }
171
172    pub fn is_logical(&self) -> bool {
173        matches!(
174            self,
175            Operator::LogicalAnd | Operator::LogicalOr | Operator::LogicalNot
176        )
177    }
178
179    pub fn is_arithmetic(&self) -> bool {
180        matches!(
181            self,
182            Operator::Plus
183                | Operator::Minus
184                | Operator::Star
185                | Operator::Slash
186                | Operator::Percent
187                | Operator::StarStar
188        )
189    }
190}